﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using myFinance.BLL;
using myFinance.Models;
using System.Diagnostics;
using myFinance.Models.ViewModels;
using System.Text;

namespace myFinance.Controllers
{
    [Authorize]
    public class ContaController : Controller
    {
        #region ViewModels        
        ContaViewModel viewModel = new ContaViewModel();
        #endregion

        #region Index
        public ActionResult Index() // Index padrão
        {
            // Se o usuário ainda não tiver um cadastro gravado, retorna pro cadastro
            if (PessoaBll.GetPessoa(User.Identity.Name) == null)
                return RedirectToAction("Cadastro", "Perfil");

            ViewBag.Mes = new SelectList(AuxiliaresBll.PreencheComboMes(), "Value", "Key", DateTime.Now.Month);
            ViewBag.Ano = new SelectList(AuxiliaresBll.PreencheComboAno(), DateTime.Now.Year);

            var model = viewModel.Listar(User.Identity.Name, DateTime.Now.Month, DateTime.Now.Year, false);
            return View(model);
        }

        [HttpGet]
        public ActionResult Filtrar(int mes, int ano, bool tipoData)
        {
            var model = viewModel.Listar(User.Identity.Name, mes, ano, tipoData);
            var lista = ConstroiTabela(model);
            return Json(new { tbody = lista[0], tfoot = lista[1] }, JsonRequestBehavior.AllowGet);
        }
        #endregion

        #region Cadastro
        // o campo id representa o código de referencia
        public ActionResult Cadastro(int id) // Formulário de Cadastro
        {
            var usuario = User.Identity.Name;
            var p = PessoaBll.GetPessoa(usuario);

            // Se o usuário ainda não tiver um cadastro gravado, retorna pro cadastro
            if (p == null)
                return RedirectToAction("Cadastro", "Perfil");

            var model = new Conta();
            if (id > 0)
            {
                model = ContaBll.GetConta(id, usuario);
                if (model.IdContaPrincipal > 0)
                {
                    ViewBag.ContaOriginal = "Cód. Ref.:" + model.CodigoReferencia.ToString();
                }
                else
                {
                    ViewBag.ContaOriginal = "";                    
                }
                ViewBag.GrupoDespesa = new SelectList(GrupoDespesaBll.PreencheComboGrupoDespesa(User.Identity.Name), "Id", "Nome", model.GrupoDespesaId);
                ViewBag.SubGrupoDespesa = new SelectList(SubGrupoDespesaBll.PreencheComboSubGrupoDespesa(User.Identity.Name, model.GrupoDespesaId), "Id", "Nome", model.SubGrupoDespesaId);
            }
            else
            {
                model.PessoaId = p.Id;
                model.Parcela = 1;
				ViewBag.GrupoDespesa = new SelectList(GrupoDespesaBll.PreencheComboGrupoDespesa(User.Identity.Name), "Id", "Nome", model.GrupoDespesaId);
				var idGrupo = GrupoDespesaBll.GetId(User.Identity.Name);
				ViewBag.SubGrupoDespesa = new SelectList(SubGrupoDespesaBll.PreencheComboSubGrupoDespesa(User.Identity.Name, idGrupo), "Id", "Nome", model.SubGrupoDespesaId);						
            }
            return View(model);
        }
        #endregion

        #region Salvar
        [HttpPost]
        public ActionResult Cadastro(Conta modelView)
        {
            if (ModelState.IsValid)
            {
                var usuario = User.Identity.Name;
                try
                {
                    if (modelView.CodigoReferencia > 0)
                    {
                        var model = ContaBll.GetConta(modelView.CodigoReferencia, usuario);
                        TryUpdateModel(model);
                        ContaBll.Edit(model);
                    }
                    else
                    {
                        var model = new Conta();
                        TryUpdateModel(model);
                        model.CodigoReferencia = ContaBll.GetUltimoCodigoReferencia(usuario);                        
                        ContaBll.Add(model);
                    }

                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    ViewBag.GrupoDespesa = new SelectList(GrupoDespesaBll.PreencheComboGrupoDespesa(User.Identity.Name), "Id", "Nome");
                    var idGrupo = GrupoDespesaBll.GetId(User.Identity.Name);
                    ViewBag.SubGrupoDespesa = new SelectList(SubGrupoDespesaBll.PreencheComboSubGrupoDespesa(User.Identity.Name, idGrupo), "Id", "Nome");

                    ModelState.AddModelError(string.Empty, ex);
                    return View(modelView);
                }
            }
            else
            {
                ViewBag.GrupoDespesa = new SelectList(GrupoDespesaBll.PreencheComboGrupoDespesa(User.Identity.Name), "Id", "Nome");
                var idGrupo = GrupoDespesaBll.GetId(User.Identity.Name);
                ViewBag.SubGrupoDespesa = new SelectList(SubGrupoDespesaBll.PreencheComboSubGrupoDespesa(User.Identity.Name, idGrupo), "Id", "Nome");

                return View(modelView);
            }
        }
        #endregion

        //#region Excluir
        //[HttpPost]
        //public ActionResult Excluir(int id) // Método de exclusão do registro
        //{
        //    try
        //    {
        //        Conta.Delete(id);
        //        return Json(true);
        //    }
        //    catch (Exception ex)
        //    {
        //        string msgEx = "Houve um erro na exclusão do registro:";
        //        if (ex.InnerException == null)
        //        {
        //            msgEx += ex.Message;
        //        }
        //        else
        //        {
        //            msgEx += ex.InnerException.Message;
        //        }
        //        return Json(new { msgErro = msgEx });
        //    }
        //}
        //#endregion

        public List<string> ConstroiTabela(List<ContaViewModel> model)
        {
            var tbody = new StringBuilder();
            var tfoot = new StringBuilder();

            if (model.Count() > 0)
            {
                foreach (ContaViewModel m in model)
                {
                    tbody.Append("<tr>");
                    tbody.AppendFormat("<td class=\"cod-ref\">{0}</td>", m.CodRef);
                    tbody.AppendFormat("<td class=\"desc\">{0}</td>", m.Descricao);
                    tbody.AppendFormat("<td class=\"datas\">{0}</td>", m.DataCadastro.ToShortDateString());
                    tbody.AppendFormat("<td class=\"datas\">{0}</td>", m.DataVencimento.ToShortDateString());
                    tbody.AppendFormat("<td class=\"parcela\">{0}</td>", m.Parcelas);
                    if (m.Entrada == 1)
                    {
                        tbody.AppendFormat("<td class=\"valores entrada\">{0}</td>", m.Valor.ToString("N2"));
                        tbody.Append("<td class=\"valores saida\" style=\"text-align: center\">-----</td>");
                    }
                    else
                    {
                        tbody.Append("<td class=\"valores entrada\" style=\"text-align: center\">-----</td>");
                        tbody.AppendFormat("<td class=\"valores saida\">{0}</td>", m.Valor.ToString("N2"));
                    }
                    tbody.AppendFormat("<td class=\"fechado\"> <input type=\"checkbox\" id=\"Fechado\" disabled=\"disabled\"{0} /> </td>", m.Fechado ? " checked=\"checked\"" : "");
					tbody.AppendFormat("<td class=\"opcoes\"><a href=\"{0}/{1}\" class=\"editar\" >Editar</a> | ", Url.Action("Cadastro", "Conta"), m.CodRef);
                    tbody.AppendFormat("<a href=\"#\" data-url=\"{0}\" class=\"excluir\"> Excluir</a> </td>", Url.Action("Excluir", "Conta") + "/" + m.CodRef);
                    tbody.Append("</tr>");
                }

                var totalEntradas = model.Where(w => w.Entrada == 1).Sum(s => s.Valor);
                var totalSaidas = model.Where(w => w.Entrada == 2).Sum(s => s.Valor);
                var totalGeral = totalEntradas - totalSaidas;
                var classeTotal = totalGeral >= 0 ? "entrada" : "saida";

                tfoot.Append("<tr style=\"text-align: right\">");
                tfoot.Append("<td colspan=\"5\"> Totais: </td>");
                tfoot.AppendFormat("<td class=\"entrada\">{0} </td>", totalEntradas.ToString("N2"));
                tfoot.AppendFormat("<td class=\"saida\">{0}</td>", totalSaidas.ToString("N2"));
                tfoot.Append("<td colspan=\"2\"></td>");
                tfoot.Append("</tr>");
                tfoot.Append("<tr style=\"text-align: right; font-size: 14px;\">");
                tfoot.Append("<td colspan=\"5\">Total Geral: </td>");
                tfoot.AppendFormat("<td colspan=\"2\" class=\"{0}\">{1}</td>", classeTotal, totalGeral.ToString("N2"));
                tfoot.Append("<td colspan=\"2\"></td>");
                tfoot.Append("</tr>");
            }
            else
            {
                tbody.Append("<tr><td colspan=\"9\">&nbsp;Não foram encontrados registros ou ainda não existem contas cadastradas.</td></tr>");
                tfoot.Append("<tr><td colspan=\"9\"></td></tr>");
            }

            var lista = new List<string>();
            lista.Add(tbody.ToString());
            lista.Add(tfoot.ToString());

            return lista;
        }
    }
}
